// pages/cart/index.js
// 获取用户收货地址
/*
  1.绑定事件
  2.调用小程序api wx.chooseAddress
  2.获取 用户 对小程序所授予的 获取地址的 权限 状态 scope
    1.用户 点击的是确定
        scope:true
    2.用户点击的是取消
        scope:false
        1.诱导用户 自己 打开 授权设置页面 当用重新给与 获取地址权限 发时候
        2.获取收货地址
    3.用户未点击过，
      scope:undefind


  4.全选的实现 数据的展示
    1.onShow 获取缓存中的购物车数组
    2.根据购物车中的商品数据 所有的商品都被选中 checked =true
  5.总价格与总数量
    1.都需要商品被选中
    2.获取购物车数组 遍历 
    3.判断商品是否被选择
    4.总价格+=单价*数量  总数量+=商品数量
    5.把计算后的价格和数量设置到data
  6.商品的选中
    1 绑定change 事件
    2 获取到被修改的商品对象
    3 商品对象的选中状态 取反
    4 重新填充回 data 中 和缓存中
    5 重新计算全选 ，总价格， 总数量 
  7.全选和反选
    1 绑定事件
    2 获取 data 中的全选变量 allChecked
    3 直接取反
    4 遍历购物车数组 让里面的商品 选中 状态 跟随 allChecked 改变而改变
    5 把数组 和allchecked 重新设置回data 和缓存中
  8.商品数量 的编辑功能
    1.给两个按钮绑定同一个点击事件 区分关键 自定义属性
        1 “+”，，，“+1”
        2 “-” ，，，“-1”
    2.传递被点击的商品id  goods_id
    3.获取data 的购物车数组 来获取需要被修改的商品对象
    4.当购物车数量为1 同时用户点击-
        询问是否删除
    4.直接修改商品对象的数量 num
    5.把 cart 重新设置回缓存和data中  this.setCart 
*/
import { showModal, getSetting, openSetting, chooseAddress } from "../../utils/asyncWx"
import regeneratorRuntime from '../../lib/runtime/runtime';
Page({

  /**
   * 页面的初始数据
   */
  data: {
    address: {},
    cart: [],
    allChecked: false,
    totalPrice: 0,
    totalNum: 0
  },

  /**
   * 生命周期函数--监听页面加载
   */
  onLoad: function (options) {

  },
  //收货地址 
  async handleChooseAddress() {
    //2.获取收货地址

    //1.获取 权限状态

    //注：api接口改变 wx.getSetting不可用
    // wx.getSetting({
    //   success: (res) => {
    //     //2.获取权限状态
    //     const scopeAddress = res.authSetting['scope.address']
    //     console.log(res,scopeAddress)
    //     if (scopeAddress === true || scopeAddress === undefined) {
    //       wx.chooseAddress({
    //         success: (result) => {
    //           console.log(result)
    //         },
    //       })
    //     } else {
    //       //3.用户拒绝授予权限 诱导用户打开权限
    //       console.log(scopeAddress)
    //       wx.openSetting({
    //         //4.可以调用 收货地址代码
    //         success: (result2) => {
    //           console.log(result2)
    //           wx.chooseAddress({
    //             success: (result3) => {
    //               console.log(result3)
    //             }
    //           });
    //         }
    //       });
    //     }
    //   },
    // })



    const res = await getSetting()
    const scopeAddress = res.authSetting['scope.address']
    if (scopeAddress === false) {
      await openSetting()
    }
    let address = await chooseAddress()
    address.all = address.provinceName + address.cityName + address.countyName + address.detailInfo
    wx.setStorageSync('address', address)

  },

  onShow() {
    const address = wx.getStorageSync('address')
    //获取缓存中的购物车数据据
    const cart = wx.getStorageSync('cart') || [];
    //1.计算全选
    // every 数组方法 会便利 会接受一个回调函数 那么 每一个回调函数都返回true 
    //那么every函数才会返回true,只要有一个回调函数返回false ，就不再执行，返回false
    //空数组调用 every 返回true
    // const allChecked = cart.length ? cart.every(item => item.checked) : false
    this.setData({ address })
    this.setCart(cart)
  },
  //商品的选中
  handeItemChange(e) {
    // 1.获取商品id
    const goods_id = e.target.dataset.id
    //获取购物车数组
    let { cart } = this.data
    //找到被修改的商品对象
    let index = cart.findIndex((item) => item.goods_id === goods_id)
    //商品对象的选中状态 取反
    cart[index].checked = !cart[index].checked
    //把购物车数据重新设置
    this.setCart(cart)
  },
  //商品全选
  handleItemAllChecked() {
    let { cart, allChecked } = this.data
    allChecked = !allChecked
    cart.forEach(v => v.checked = allChecked);
    this.setCart(cart)
  },
  //商品数量事件的编辑
  async handleItemNumEdit(e) {

    const { operation, id } = e.target.dataset
    let { cart } = this.data
    const index = cart.findIndex(v => v.goods_id === id)
    if (cart[index].num === 1 && operation === -1) {
      const res = await showModal({ content: "你是否要删除当前商品？" })
      if (res.confirm) {
        cart.splice(index, 1)
        this.setCart(cart)
      }
    } else {
      cart[index].num += operation
      this.setCart(cart)
    }

  },

  //设置购物车状态 重新计算 函数
  setCart(cart) {

    //重新计算
    let totalPrice = 0
    let totalNum = 0
    let allChecked = true
    cart.forEach(v => {
      if (v.checked) {
        totalPrice += v.num * v.goods_price
        totalNum += v.num
      } else {
        allChecked = false
      }
    });
    //判断一下数组是否为空
    allChecked = cart.length != 0 ? allChecked : false
    this.setData({
      cart,
      totalPrice, totalNum, allChecked
    })
    wx.setStorageSync('cart', cart)
  }
})